package ar.com.algotres.tpdos.modelo.disparos.estrategias;

import java.util.ArrayList;
import java.util.List;

import ar.com.algotres.tpdos.modelo.disparos.Disparo;
import ar.com.algotres.tpdos.modelo.disparos.PosicionAExplotarInvalidaExcpetion;
import ar.com.algotres.tpdos.modelo.fisica.CoordenadasDePosicioInvalidaException;
import ar.com.algotres.tpdos.modelo.fisica.Posicion;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionAbajo;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionArriba;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionDerecha;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionDiagonalAbajoDerecha;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionDiagonalAbajoIzquierda;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionDiagonalArribaDerecha;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionDiagonalArribaIzquierda;
import ar.com.algotres.tpdos.modelo.fisica.direcciones.DireccionIzquierda;
import ar.com.algotres.tpdos.modelo.tablero.Tablero;

public class EstrategiaDeImpactoDoble implements EstrategiaDeImpacto {

	@Override
	public void impactarEn(Posicion posicion, Disparo propietario)
			throws PosicionAExplotarInvalidaExcpetion {
		List<Posicion> posiciones = null;
		try {
			posiciones = this.posicionesADisparar(posicion);
		} catch (CoordenadasDePosicioInvalidaException e) {
			throw new PosicionAExplotarInvalidaExcpetion(e.getMessage());
		}
		for (Posicion posicionADisparar : posiciones) {
			Tablero.getInstance().explosionEn(posicionADisparar, propietario);
		}
	}

	private List<Posicion> posicionesADisparar(Posicion posicion)
			throws CoordenadasDePosicioInvalidaException {
		List<Posicion> posiciones = new ArrayList<>();
		posiciones.add(posicion);
		posiciones.add(posicion.siguienteEn(new DireccionAbajo()));
		posiciones.add(posicion.siguienteEn(new DireccionArriba()));
		posiciones.add(posicion.siguienteEn(new DireccionDerecha()));
		posiciones.add(posicion.siguienteEn(new DireccionIzquierda()));
		posiciones.add(posicion
				.siguienteEn(new DireccionDiagonalAbajoDerecha()));
		posiciones.add(posicion
				.siguienteEn(new DireccionDiagonalArribaDerecha()));
		posiciones.add(posicion
				.siguienteEn(new DireccionDiagonalAbajoIzquierda()));
		posiciones.add(posicion
				.siguienteEn(new DireccionDiagonalArribaIzquierda()));
		return posiciones;
	}
}
